#include <stdio.h>
#include <stdlib.h>

/*
 *p指针变量
 *arr数组名 常量
 */
static void test1(void)
{
	int arr[3]= {1,2,3};
	int i = 0;
	int *p = arr;

	printf("%p	%p\n",arr,arr+1);
	printf("%p	%p	%p\n",p,p+1,p++);//p++  ->  p=p+1;p的指向变了		p+1指向没有改变


	for (i=0;i<sizeof(arr)/sizeof(*arr);i++)
	{
		printf("%p---->%d ",p+i,*(p+i)); //arr + i == &arr[i] == p + i;		arr[i] == *(p+i);
		
	}
	printf("\n");

}
/*
 *p++ 与指针使用时的bug：p的指向不断移动
 * */
static void test2(void)
{
	int arr[3];
	int i = 0;
	int *p = arr;

	for (i=0;i<sizeof(arr)/sizeof(*arr);i++)
	{
		printf("%p--->%d   ",arr+i,arr[i]);
	}
	printf("\n");


	for (i=0;i<sizeof(arr)/sizeof(*arr);i++)
	{
		scanf("%d",p++);

	}
	//重新指向
	p = arr;	
	for (i=0;i<sizeof(arr)/sizeof(*arr);i++,p++) //运算符优先级问题
	{
		printf("%p---> %d   ",p, *p);

	}
	printf("\n");


	for (i=0;i<sizeof(arr)/sizeof(*arr);i++)
	{	
		printf("%p--->%d   ",arr+i,arr[i]);
	}
	printf("\n");

}
/*
 * 罕见用法(不推荐)
 * 不用数组名  使用指针引用无名数组
 * */
static void test3(void)
{

	int *p = (int [3]){1,2,3};
	int i = 0;

	for (i=0;i<3;i++)
	{
		printf("%p--->%d\n",&p[i],p[i]);

	}

}
/*
 *指针 ++  --
 * */
static void test4(void)
{
	int a[] = {5,1,7,2,8,3};
	int y;
	int *p = &a[1];
	
	y=(*--p)++; //注意后自增	*--p ==> __ = &a[1]-1 ; *p=&a[0];    a[0]++ ==> a[0] = a[0]+1;  __ = a[0];
	printf("a[0] = %d\n",*p);// a[0] = 6;
	printf("y = %d\n",y);//y = 5
}

int main(void)
{
//	test1();
//	test2();
//	test3();
	test4();
	exit(0);
}
